/**
 * 格式化货币
 * @param value 数值
 * @returns 格式化后的货币字符串
 */
export const formatCurrency = (value: number | string): string => {
  if (value === null || value === undefined || value === '') {
    return '¥0.00'
  }

  const num = typeof value === 'string' ? parseFloat(value) : value
  if (isNaN(num)) {
    return '¥0.00'
  }

  return (
    '¥' +
    num.toLocaleString('zh-CN', {
      minimumFractionDigits: 2,
      maximumFractionDigits: 2,
    })
  )
}

/**
 * 格式化日期
 * @param date 日期对象或时间戳，可为null或undefined
 * @param format 格式化字符串
 * @returns 格式化后的日期字符串
 */
export const formatDate = (date: Date | number | string | null | undefined, format = 'YYYY-MM-DD'): string => {
  // 如果是空值，直接返回空字符串
  if (date === null || date === undefined || date === '' || date === 0) {
    return ''
  }

  let d: Date

  // 处理时间戳（后端返回的是秒级时间戳）
  if (typeof date === 'number') {
    // 如果是秒级时间戳，需要乘以1000转换为毫秒级
    // 通常秒级时间戳的范围是 10位数字，毫秒级是13位数字
    if (date >= 1000000000 && date < 100000000000) {
      // 10位到12位数字认为是秒级时间戳
      d = new Date(date * 1000)
    } else {
      d = new Date(date)
    }
  } else if (typeof date === 'string') {
    // 如果是字符串，尝试转换为数字再处理
    const num = parseInt(date, 10)
    if (!isNaN(num) && num !== 0) {
      if (num >= 1000000000 && num < 100000000000) {
        // 10位到12位数字认为是秒级时间戳
        d = new Date(num * 1000)
      } else {
        d = new Date(num)
      }
    } else {
      // 尝试直接解析日期字符串
      d = new Date(date)
    }
  } else {
    d = date
  }

  // 检查日期是否有效
  if (!(d instanceof Date) || isNaN(d.getTime())) {
    return ''
  }

  const year = d.getFullYear()
  const month = String(d.getMonth() + 1).padStart(2, '0')
  const day = String(d.getDate()).padStart(2, '0')
  const hours = String(d.getHours()).padStart(2, '0')
  const minutes = String(d.getMinutes()).padStart(2, '0')
  const seconds = String(d.getSeconds()).padStart(2, '0')

  return format
    .replace('YYYY', String(year))
    .replace('MM', month)
    .replace('DD', day)
    .replace('HH', hours)
    .replace('mm', minutes)
    .replace('ss', seconds)
}

/**
 * 格式化日期时间（精确到分钟）
 * @param date 日期对象或时间戳，可为null或undefined
 * @param format 格式化字符串，默认为精确到分钟
 * @param defaultValue 当日期无效时返回的默认值
 * @returns 格式化后的日期时间字符串
 */
export const formatDateTime = (
  date: Date | number | string | null | undefined, 
  format = 'YYYY-MM-DD HH:mm',
  defaultValue = ''
): string => {
  // 处理null、undefined或空字符串的情况
  if (date === null || date === undefined || date === '') {
    return defaultValue
  }
  return formatDate(date, format)
}

/**
 * 格式化日期时间（包含秒）
 * @param date 日期对象或时间戳
 * @returns 格式化后的日期时间字符串（包含秒）
 */
export const formatDateTimeWithSeconds = (date: Date | number | string): string => {
  return formatDate(date, 'YYYY-MM-DD HH:mm:ss')
}
